package com.zhuang.collection.list;

public class LinkedList01 {
	public static void main(String[] args) {
		// 模拟一个简单的双向链表
		Node jack = new Node("jack");
		Node tom = new Node("tom");
		Node kang = new Node("kang");
		// 连接三个结点，形成双向链表
		// jack -> tom -> kang
		jack.next = tom;
		tom.next = kang;
		// kang -> tom -> jack
		kang.pre = tom;
		tom.pre = jack;
		// 让 first 引用指向 jack,就是双向链表的头结点
		Node first = jack;
		// 让 last 引用指向 kang,就是双向链表的尾结点
		Node last = kang;

		System.out.println("===从头到尾进行遍历===");
		while (true) {
			if (first == null) {
				break;
			}
			System.out.println(first);
			// 头节点指向下一个
			first = first.next;
		}

		System.out.println("====从尾到头的遍历====");
		while (true) {
			if (last == null) {
				break;
			}
			// 输出 last 信息
			System.out.println(last);
			last = last.pre;
		}

		// 新加一个node节点
		Node jerry = new Node("jerry");

		jerry.next = tom;
		jerry.pre = jack;
		tom.pre = jerry;
		jack.next = jerry;

		// 让 first 再次指向 jack
		first = jack;// 让 first 引用指向 jack,就是双向链表的头结点

		last = kang;
		System.out.println("===从头到尾进行遍历===");
		while (true) {
			if (first == null) {
				break;
			}
			System.out.println(first);
			// 头节点指向下一个
			first = first.next;
		}

		System.out.println("====从尾到头的遍历====");
		while (true) {
			if (last == null) {
				break;
			}
			// 输出 last 信息
			System.out.println(last);
			last = last.pre;
		}
	}

	// 定义一个 Node 类，Node 对象 表示双向链表的一个结点
	static class Node {
		public Object item; // 真正存放数据
		public Node next; // 指向后一个结点
		public Node pre; // 指向前一个结点

		public Node(Object name) {
			this.item = name;
		}

		@Override
		public String toString() {
			return "Node name{" + "item=" + item + '}';
		}
	}
}
